package proxy;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Proxy;

public class Main {

    public interface A {

        int a();

        default int b() {
            System.out.println(this.toString());
            return 10;
        }
    }

    public static void main(String[] args){
        Main target = new Main();
        A a = (A) Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[]{A.class}, (proxy, method, args1) -> {
            if (method.getDeclaringClass() == Object.class) {
                return method.invoke(target, args1);
            } else if (method.isDefault()) {

                return MethodHandles.lookup().in(method.getDeclaringClass())
                    .findSpecial(method.getDeclaringClass(), method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes()), method.getDeclaringClass()).bindTo(proxy).invokeWithArguments(args1);
            } else if (method.getName().equals("a")) {
                return 100;
            }
            return null;
        });
        a.a();
    }
}
